package com.ddone.demo.controller;

import com.ddone.demo.bean.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ddone
 * @date 2024/3/23-10:17
 *
 * TODO： 接收参数
 *     1.普通参数接收 【默认】
 *         1.1 散装接收  (参数类型 请求参数名,参数类型 请求参数名)
 *         1.2 集合接收 （List 请求参数名）  @RequestParam(name,required,defaultValue)
 *         1.3 实体类接收 (实体类 属性名)    属性名 = 请求参数的名
 *         1.4 级联属性接收 (实体类 属性名)  集合 属性名[index].属性名  内嵌对象 属性名.对象的属性
 *     2.请求头参数接收
 *         1.1 请求头   （@RequestHeader(name="请求头的名")参数类型String 请求头的名称）
 *     3.Cookie数据接收
 *         1.1 cookieValue  (@CookieValue(name="cookie的name")String cookie变量)
 *     4.请求路径参数接收
 *         1.1 路径参数  /{key}  (@PathVariable(name="")数据类型 key的名称)
 *     5.请求体参数接收
 *         1.1 直接接收   (@RequestBody(required=true) String data)
 *         1.2 map封装接收 (@RequestBody Map data) Map - LinkedHashMap  [] -> ArrayList
 *         1.3 实体类接收  (@RequestBody 实体类 对象) [] -> List {} -> 对象类型 [{}] -> List<对象>
 * TODO:  响应数据
 *     1.视图页面响应
 *       方法返回值String  return "逻辑视图名";
 *     2.转发和重定向
 *       方法返回值String  return "forward|redirect:/地址  项目下的相对路径";
 *     3.响应体返回数据
 *       3.1 返回字符串  方法返回值 String  return JsonString; 必须添加 @ResponseBody + @RestController
 *       3.2 直接返回类型 方法返回值 返回的数据类型   return 数据;  必须添加 @ResponseBody + @RestController
 *
 *
 */

@RequestMapping("/json/user")
@RestController
// @RestController = @ResponseBody + @Controller
@Slf4j
public class JsonUserController {
/*
 * TODO: 接收前端的json数据
 *       所有接收都在形参列表!
 *       默认：请求参数  key=value&key=value
 *       非默认：必须指定注解
 *               请求头 @RequestHeader
 *               Cookie @CookieValue
 *               路径参数 @PathVariable
 *               JSON:  @RequestBody
 *   1.整体接收参数  @RequestBody String 随意命名  @RequestBody不会出现多次，整体接收！
 *     不推荐，还需要自己转化！ ObjectMapper
 *   2.转化后接收Map
 *     map的好处，不用声明实体类
 *     map的缺点，需要做类型转化
 *     map的具体实现
 *          参数列表的Map LinkedHashMap
 *          [] -> ArrayList
 *          {} -> LinkedHashMap
 *   3.使用实体对象进行接收
 *     好处： 不需要进行类型转化
 *     缺点： 需要自己按照数据格式声明实体类
 *
 *  TODO: 向前端返回JSON @ResponseBody
 *      1. 直接在方法或者类上添加@ResponseBody即可
 *         将返回的数据，直接放入响应体，返回给前端！注意：不在走财务的流程了！【不找逻辑视图】
 *      2.方法的返回值可以修改成任意可以转成JSON的数据格式
 *         User List<User> Map 等等 @ResponseBody HandlerAdapter -> java数据 -> json字符串写回！
 *      3. @ResponseBody和@RestController
 *         | @ResponseBody 可以添加到方法也可以是类！ 类上代表类的每个方法都是响应体返回数据！
 *         | @RestController  = @Controller + @ResponseBody
 *
 */
    @Autowired
    private ObjectMapper objectMapper;

    @PostMapping("/login")
    public String login(@RequestBody User user){
        log.warn("user = " + user);
        // 类上@RestController 代表 返回的是字符串 不是视图模型
        return "响应成功~";
    }

    @PostMapping("/regist")
    public HashMap<String, Object> regist(@RequestBody String json){
        log.warn("json = " + json);
        HashMap<String, Object> data = new HashMap<>();
        data.put("status", "ok");
        data.put("data",new User());
        return data;
    }

    @PostMapping("info")
    public String info(@RequestBody Map<String,Object> data){
        System.out.println("data = " + data);
        String ids = data.get("ids").getClass().getSimpleName();
        System.out.println("ids = " + ids);

        String address = data.get("address").getClass().getSimpleName();
        System.out.println("address = " + address);

        return "index";
    }

}
